package io;

import java.io.File;
import java.io.FilenameFilter;
import java.io.IOException;

/**
 * @author Cheng Jun
 * @version 1.0
 * Description: File API 学习
 * file 既可以表示一个文件对象，也可以表示一个目录对象。目录是特殊的文件
 * @date 2019/10/23 16:50
 * @see File
 * @see IOExceptionExample
 */
public class FileExample {

    public static void main(String[] args) {
        File myFile = new File("D:\\gitee\\java\\src\\io\\TestFile1");
        File childFile = new File(myFile, "ForFileExample.txt");

        System.out.println("myFile.toString():" + myFile);
        System.out.println("childFile.toString():" + childFile);

        System.out.println("myFile.getName():" + myFile.getName());
        System.out.println("childFile.getName():" + childFile.getName());

        System.out.println("myFile.getParent():" + myFile.getParent());
        System.out.println("childFile.getParent():" + childFile.getParent());

        System.out.println("myFile.getAbsoluteFile():" + myFile.getAbsoluteFile());
        System.out.println("childFile.getAbsoluteFile():" + childFile.getAbsoluteFile());

        System.out.println("myFile.getPath():" + myFile.getPath());
        System.out.println("childFile.getPath():" + childFile.getPath());

        try {
            //获取标准路径
            System.out.println("myFile.getCanonicalPath():" + myFile.getCanonicalPath());
            System.out.println("childFile.getCanonicalPath():" + childFile.getCanonicalPath());
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        System.out.println("myFile.exists():" + myFile.exists());
        System.out.println("childFile.exists():" + childFile.exists());

        System.out.println("myFile.canRead():" + myFile.canRead());
        System.out.println("myFile.canWrite():" + myFile.canWrite());
        System.out.println("childFile.canRead():" + childFile.canRead());
        System.out.println("childFile.canWrite():" + childFile.canWrite());

        if (!myFile.exists()) {
            //mkdirs创建不存在的父级目录，mkdir创建最后一级目录，如果上级目录不存在则创建失败
            // System.out.println(myFile + "是否创建成功" + myFile.mkdirs());
            System.out.println(myFile + "是否创建成功" + myFile.mkdir());
        }

        //判断文件是否存在，不存在则新建
        try {
            boolean isExists = childFile.exists();
            if (isExists) {
                System.out.println(".\\src\\io\\TestFile\\ForFileExample.txt 文件已经存在，无需创建");
            } else {
                //创建 D:\gitee\java\src\io\TestFile\ForFileExample.txt 文件
                boolean isCreated = childFile.createNewFile();
                if (isCreated) {
                    System.out.println("D:\\gitee\\java\\src\\io\\TestFile\\ForFileExample.txt 文件创建成功");
                } else {
                    System.out.println("D:\\gitee\\java\\src\\io\\TestFile\\ForFileExample.txt 文件创建失败");
                }
            }
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        System.out.println("myFile.isDirectory():" + myFile.isDirectory());
        System.out.println("myFile.isFile():" + myFile.isFile());
        System.out.println("childFile.isDirectory():" + childFile.isDirectory());
        System.out.println("childFile.isFile():" + childFile.isFile());

        //重命名
        File childFileNew = new File(myFile, "ForFileExampleNew.txt");
        boolean rename = childFile.renameTo(childFileNew);
        System.out.println(rename);

        //获取下级目录
        File[] files = myFile.listFiles();
        for (File file : files) {
            System.out.println(file);
        }

        FilenameFilter filenameFilter = (File dir, String name) -> name.contains("New");
        File[] filesByFilter = myFile.listFiles(filenameFilter);
        for (File file : filesByFilter) {
            System.out.println("文件名包含New字符的文件" + file);
        }
        //getTotalSpace 总容量、getFreeSpace 空闲空间、getUsableSpace 可用空间
        System.out.println(myFile.getTotalSpace());
        System.out.println(myFile.getFreeSpace());
        System.out.println(myFile.getUsableSpace());

        //delete删除文件或目录:删除目录时，需要先将目录下的所有东西清空，空目录才能删除。
        // System.out.println(childFile.delete());
        // System.out.println(myFile.delete());

        //delete和deleteOnExit的区别在于：delete()当代码执行到这句时，会立即删除；deleteOnExit()代码执行到这句时，将删除的命令缓存，JVM 终止时才真正删除
        // childFile.deleteOnExit();
        // myFile.deleteOnExit();

    }
}
